做一个无向图的权重单一的最短路径算法。
模拟停车场最近车位的选择。
首先参考了博友JavaMan_chen的博文
http://blog.csdn.net/javaman_chen/article/details/8254309
但是这个算法是有问题的。
算法中,如果A点是当前点,是选取距离A点权重最小的那一点作为下一个路径点的。
这就带来了一个问题,即,距离A点的2个点如果权重相同,那就会随机选取其中一条。
于是,在数据量稍微大点的时候,就出错了。
在这里使用Dijkstra算法使用的是用OPEN, CLOSE表的方式。
首先,定义了坐标点的数据结构
Coordinate.java
Coordinate中包含相邻坐标的List,以及距离起始点的距离。
在算法中,一开始要进行所有路径点的关联。
之后,通过从起始点进行扩散,将所有点的step计算出来。
package com.harlan.dijkstra;
import java.util.LinkedList;
/**
* 坐标点的数据结构
*
* @author Harlan
*
*/
public class Coordinate {
//x坐标
public int x;
//y坐标
public int y;
//相邻坐标
public LinkedList<Coordinate> adj;
//距离
public int steps;
// 最短路径中的前一个顶点
public Coordinate lastPoint;
;
public Coordinate(){
}
public Coordinate(int newX, int newY) {
x = newX;
y = newY;
adj=new LinkedList<Coordinate>();
reset();
}
public void reset(){
steps=Integer.MAX_VALUE;
lastPoint=null;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Coordinate))
return false;
Coordinate other = (Coordinate) obj;
if (x == other.x && y == other.y) {
return true;
}
return false;
}
@Override
public int hashCode() {
return x*10000+y;
}
/**
* 以JSON格式展示坐标
*/
@Override
public String toString() {
return "{\"x\":" + x + ",\"y\":"